/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import database_beans.PlanAngazovanja;
import database_beans.Predmet;
import database_beans.Zaposleni;
import java.io.Serializable;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.primefaces.event.TabChangeEvent;
import server.Log;
import server.Util;

/**
 *
 * @author stefan
 */
@ManagedBean
@ViewScoped
public class TableZaposleni implements Serializable {

    private String[] zvanja = {"Redovni profesor", "Vandredni profesor", "Docent", "Asistent", "Saradnik u nastavi",
        "Istrazivac", "Laboratorijski inzinjer", "Laboratorijski tehnicar"};
    private int[] zvanjaCode = {0, 1, 2, 3, 4, 5, 6};

    private ArrayList<Zaposleni> redovniProfesori;

    private ArrayList<Zaposleni> vandredniProfesori;

    private ArrayList<Zaposleni> docenti;

    private ArrayList<Zaposleni> asistenti;

    private ArrayList<Zaposleni> saradniciUNastavi;

    private ArrayList<Zaposleni> istrazivaci;

    private ArrayList<Zaposleni> ostaliMucenici;
    
    private ArrayList<Predmet> predmetList;

    public ArrayList<Predmet> getPredmetList() {
        return predmetList;
    }

    public void setPredmetList(ArrayList<Predmet> predmetList) {
        this.predmetList = predmetList;
    }
    
    
    

    public TableZaposleni() {
        loadZaposleni("Redovni profesori");
    }

    public String[] getZvanja() {
        return zvanja;
    }

    public void setZvanja(String[] zvanja) {
        this.zvanja = zvanja;
    }

    public int[] getZvanjaCode() {
        return zvanjaCode;
    }

    public void setZvanjaCode(int[] zvanjaCode) {
        this.zvanjaCode = zvanjaCode;
    }

    public ArrayList<Zaposleni> getRedovniProfesori() {
        return redovniProfesori;
    }

    public void setRedovniProfesori(ArrayList<Zaposleni> redovniProfesori) {
        this.redovniProfesori = redovniProfesori;
    }

    public ArrayList<Zaposleni> getVandredniProfesori() {
        return vandredniProfesori;
    }

    public void setVandredniProfesori(ArrayList<Zaposleni> vandredniProfesori) {
        this.vandredniProfesori = vandredniProfesori;
    }

    public ArrayList<Zaposleni> getDocenti() {
        return docenti;
    }

    public void setDocenti(ArrayList<Zaposleni> docenti) {
        this.docenti = docenti;
    }

    public ArrayList<Zaposleni> getAsistenti() {
        return asistenti;
    }

    public void setAsistenti(ArrayList<Zaposleni> asistenti) {
        this.asistenti = asistenti;
    }

    public ArrayList<Zaposleni> getSaradniciUNastavi() {
        return saradniciUNastavi;
    }

    public void setSaradniciUNastavi(ArrayList<Zaposleni> saradniciUNastavi) {
        this.saradniciUNastavi = saradniciUNastavi;
    }

    public ArrayList<Zaposleni> getIstrazivaci() {
        return istrazivaci;
    }

    public void setIstrazivaci(ArrayList<Zaposleni> istrazivaci) {
        this.istrazivaci = istrazivaci;
    }

    public ArrayList<Zaposleni> getOstaliMucenici() {
        return ostaliMucenici;
    }

    public void setOstaliMucenici(ArrayList<Zaposleni> ostaliMucenici) {
        this.ostaliMucenici = ostaliMucenici;
    }

    public void onTabChange(TabChangeEvent event) {
        //TODO here goes on tab change action 
        loadZaposleni(event.getTab().getTitle());
        Log.i("onTabChanged sa eventom " + event.getTab().getTitle());

    }

    private void loadZaposleni(String zvanje) {
        Session session = Util.getSesion();
        Transaction t = session.beginTransaction();
        Criteria cr = session.createCriteria(Zaposleni.class);
        try {
            if ("Redovni profesori".equals(zvanje)) { // REDOVNI PROFESOR

                cr.add(Restrictions.eq("zvanje", zvanja[0]));
                redovniProfesori = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();

            } else if ("Vandredni profesori".equals(zvanje)) { // VANDREDNI PROFESOR

                cr.add(Restrictions.eq("zvanje", zvanja[1]));
                vandredniProfesori = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();

            } else if ("Docenti".equals(zvanje)) { // DOCENT

                cr.add(Restrictions.eq("zvanje", zvanja[2]));
                docenti = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();

            } else if ("Asistenti".equals(zvanje)) { // ASISTENT

                cr.add(Restrictions.eq("zvanje", zvanja[3]));
                asistenti = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();

            } else if ("Saradnici u nastavi".equals(zvanje)) { // SARADNIK U NASTAVI

                cr.add(Restrictions.eq("zvanje", zvanja[4]));
                saradniciUNastavi = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();

            } else if ("Istrazivaci".equals(zvanje)) { // ISTRAZIVACI

                cr.add(Restrictions.eq("zvanje", zvanja[5]));
                istrazivaci = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();

            } else { // OSTALO
                cr.add(Restrictions.eq("zvanje", zvanja[7]));
                cr.add(Restrictions.eq("zvanje", zvanja[6]));
                ostaliMucenici = new ArrayList<Zaposleni>((ArrayList<Zaposleni>) cr.list());
                t.commit();
            }
        } catch (Exception e) {
            t.rollback();
        }
    }
    
    public void loadPredmeti(Zaposleni z){
        predmetList = toList(z);
        Hibernate.initialize(predmetList);
    }
    
    public ArrayList<Predmet> toList(Zaposleni z) {
        if (z == null) {
            return null;
        }
        ArrayList<Predmet> list = new ArrayList<Predmet>();
        for (PlanAngazovanja p : new ArrayList<PlanAngazovanja>(z.getPlanAngazovanjas())) {
            list.add(p.getPredmet());
        }
        for (Predmet p : list) {
            Hibernate.initialize(p.getLabVezbes());
            Hibernate.initialize(p.getDomacis());
            Hibernate.initialize(p.getMaterijalis());
        }
        return list;
    }

    

}
